package com.winit.project.core.code;

import com.winit.common.util.Constants;
import com.winit.common.util.JSONFileUtil;
import com.winit.core.ci.vcs.VCS;
import com.winit.project.core.branch.Project;
import com.winit.project.core.set.ProjectSetConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by wangjian on 16/8/1.
 */
public class ProjectCodeConfig extends ProjectCode{

    private static final Logger logger = LoggerFactory.getLogger(ProjectCodeConfig.class);

    /**
     * 工程代码下,配置文件所在根路径
     * 例:maven工程默认为 src/main/resources
     */
    private String configPath;

    public ProjectCodeConfig(String projectName, String codePath, VCS vcs, String configPath) throws Exception {
        super(projectName,codePath, vcs);

        Project project = new Project(projectName,true);
        ProjectSetConfig setConfig = project.getProjectSetConfig();
        String subModule = setConfig.getSubModule();
        if(StringUtils.isEmpty(subModule)){
            this.configPath = configPath;
        }else {
            this.configPath = subModule+"/"+configPath;
        }
    }

    public String getConfigPath(){
        return this.configPath;
    }

    /**
     * 获取工程代码中配置文件列表
     * @return
     */
    public List<String> getConfigFileList(){
        StringBuffer path = new StringBuffer();
        path.append(this.codePath).append("/").append(this.configPath);

        List<File> fileList = new ArrayList<>();
        filterFile(new File(path.toString()), fileList);

        List<String> list = new ArrayList<>();
        for (File file:fileList){
            list.add(getConfigFileRelativePath(file));
        }
        return list;
    }

    /**
     * 获取配置文件列表并过滤特定的目录
     * 比如mybatis/sql
     * @return
     */
    private void filterFile(File dir, List<File> allFiles){
        for(File file:dir.listFiles()){
            if(file.isDirectory()){
                if(Constants.IGNORE_RESOURCE_FOLDER.contains(","+file.getName()+",")){
                    continue;
                }
                filterFile(file, allFiles);
            }else{
                allFiles.add(file);
            }
        }
    }

    /**
     * 获取文件内容
     * @param filePath 配置文件相对configPath路径
     * @return
     */
    public String getFileContent(String filePath) throws Exception{
        File file = getConfigFile(filePath);
        if(!file.exists()){
            logger.error("ProjectCodeConfig:获取文件内容,文件不存在.file="+file.getPath());
            throw new Exception("获取文件内容,文件不存在.file="+file.getPath());
        }

        if(file.isDirectory()){
            logger.error("ProjectCodeConfig:获取文件内容,传入文件为文件夹.file="+file.getPath());
            throw new Exception("获取文件内容,传入文件为文件夹.file="+file.getPath());
        }

        long length = file.length();
        if(length > 104857600){
            logger.error("ProjectCodeConfig:获取文件内容,文件超过100k.file="+file.getPath()+",length="+length);
            throw new Exception("获取文件内容,文件超过100k.file="+file.getPath()+",length="+length);
        }

        return JSONFileUtil.getFileString(file.getAbsolutePath(), true);
    }

    /**
     * 获取配置文件相对路径
     * 例:maven工程配置文件相对工程根目录的路径
     * @return
     */
    public String getConfigFileRelativePath(File file){
        return file.getAbsolutePath().replace(codePath+configPath+"/","");
    }

    /**
     *
     * @param filePath 配置文件相对configPath路径
     * @return
     */
    public boolean isConfigFileExist(String filePath){
        File file = getConfigFile(filePath);
        return file.exists();
    }

    public File getConfigFile(String filePath){
        StringBuffer path = new StringBuffer();
        path.append(this.codePath).append(this.configPath).append("/").append(filePath);
        File file = new File(path.toString());
        return file;
    }
}
